home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 98
/
Skunkware 98.iso
/
src
/
net
/
bind-contrib.tar.gz
/
bind-contrib.tar
/
contrib
/
tic
/
gendns
next >
Wrap
Text File
|
1996-10-25
|
5KB
|
193 lines
#!/bin/sh
# @(#) gendns 1.15 92/08/31 @(#)
# generate the DNS database files from generic database files
#
# files used
# hosts.main
# hosts.aliases
# hosts.mx
# hosts.ns
# hosts.wks
#
# this script assumes that a subdomain is always delegated to
# another nameserver and hosts for the subdomain except for the
# glue records do not exist in the base host database files
# Copyright (c) 1992 by Texas Internet Consulting
# This code may be freely copied and used so long as this
# copyright notice is attached. This code may not be sold
# without the express written permission of Texas Internet Consulting.
# Texas Internet Consulting makes no warranty as to the correctness
# nor the applicability of this code for any purpose.
# make the forward database files
makeforw() {
# extract host name and IP address from hosts.main
# and make A records out of it,
# but only for hosts within this domain
# add NS and A records for the servers
# add HINFO from hardware and os
( readinfo host ip hard os <hosts.main | awk -F' ' '
BEGIN {
nservers = split("'"$servers"'", servers, " ")
for (i=1; i<=nservers; i++) {
printf("'$domain'. IN NS %s.\n", servers[i])
}
}
{
for (i=1; i<=nservers; i++) {
if ($1 == servers[i]) {
printf("%s. IN A %s\n", $1, $2)
if ($3 != "X") {
printf("%s. IN HINFO %s %s\n", $1, $3, $4)
}
next
}
}
if ($1 ~ /'$escape_domain'$/) {
printf("%s. IN A %s\n", $1, $2)
if ($3 != "X") {
printf("%s. IN HINFO %s %s\n", $1, $3, $4)
}
}
}'
# make cname records out of the aliases
# again only for this domain
readinfo alias host <hosts.cname | awk -F' ' '{
if ($1 ~ /'$escape_domain'$/)
printf("%s. IN CNAME %s.\n", $1, $2)
}'
# and the MX records the same way
readinfo domain priority host <hosts.mx | awk -F' ' '{
if ($1 ~ /'$escape_domain'$/)
printf("%s. IN MX %s %s.\n", $1, $2, $3)
}'
# and WKS records
# sort them and concatenate the application protocol mnemonics
readinfo host ip proto wks <hosts.wks | sort | awk -F' ' '{
if ($1 ~ /'$escape_domain'$/) {
if ($1 != host || $2 != ip || $3 != proto) {
if (host != "") {
printf("%s. IN WKS %s %s %s\n", host, ip, proto, wks)
wks = ""
}
}
host = $1
ip = $2
proto = $3
wks = wks " " $4
}
}
END {
printf("%s. IN WKS %s %s %s\n", host, ip, proto, wks)
}' )
}
makerev() {
# extract host name and IP address from hosts.main
# and make inverse PTR records out of it
# but only for IP addresses which match the IP addresses in this domain
readinfo host ip <hosts.main | awk -F' ' '
BEGIN {
nrev = split("'$unreverse'", unreverse, ".")
nservers = split("'"$servers"'", servers, " ")
for (i=1; i<=nservers; i++) {
printf("'$domain'. IN NS %s.\n", servers[i])
}
}
{
# check for servers and output glue A records
for (i=1; i<=nservers; i++) {
if ($1 == servers[i]) {
printf("%s. IN A %s\n", $1, $2)
}
}
n = split($2, ipparts, ".")
for (i=1; i<=nrev; i++) {
if (ipparts[i] != unreverse[i])
break
}
if (i <= nrev)
next
for(; i<=n; i++)
printf("%s.", ipparts[i])
printf("%s. IN PTR %s.\n", "'$domain'", $1)
}'
}
SERIAL=serial
serial=`cat $SERIAL`
dateserial=`date +%y%m%d`
# read SOA info for each domain
readinfo domain server contact refresh retry expire min <hosts.soa |\
while read domain server contact refresh retry expire min; do
# get the domain name with escaped "."
escape_domain=`echo $domain | awk -F. '{
for (i=1; i<NF; i++) {
printf("%s", $i)
printf("\\.")
}
printf("%s", $NF)
}'`
# get servers for this domain
servers=`readinfo domain server <hosts.ns | awk -F' ' '{
if ($1 ~ /'$escape_domain'$/)
printf("%s ", $2)
}'`
case $domain in
*.in-addr.arpa)
rev=true
# get the filename fo reverse domains
# unreverse the domain name for matching IP addresses
unreverse=`echo $domain | awk -F. '{
for (i=NF-2; i>1; i--)
printf("%s.", $i)
printf("%s", $1)
}'`
filename=f.$unreverse ;;
*)
rev=
filename=$domain ;;
esac
# print the header and SOA record
( echo "; $serial"
echo '$ORIGIN'" ${domain}."
echo "@ SOA ${server}. ${contact}. ( $dateserial $refresh $retry $expire $min )"
# scan the input file and extract info depending on whether this
# is a forward or reverse domain file
if [ $rev ]; then
makerev
else
makeforw
fi |\
# get rid of extraneous domain info
sed -e 's/\(.*\)\(\.'${escape_domain}'\.\)/\1/g' \
-e 's/\(.*\)\(\.'${escape_domain}'\. \)/\1 /g' \
-e 's/^'${escape_domain}'\./@/g' ) >$filename
done